//=============================================================================
///	Utility
//=============================================================================

#ifndef	__SUTIL_H__
#define	__SUTIL_H__

#include "sexp.h"
#include <stdarg.h>		// for va_list

#ifdef __cplusplus
extern "C" {
#endif


int equal(SExp s1, SExp s2);
SExp list1(SExp c1);
SExp list2(SExp c1, SExp c2);
SExp list3(SExp c1, SExp c2, SExp c3);
SExp copy_list(SExp s);
int list_length(SExp s);
SExp last1(SExp s);					// last 1 cell
SExp nreverse(SExp s);
SExp nconc2(SExp s, SExp r);		// nconc for 2 list
SExp assoc(SExp key, SExp ls);		// test by eq
SExp member(SExp s, SExp ls);		// member 

SExp mapcar1(SExp (*fn)(SExp, void*), SExp ls, void* param);	//< mapcar for 1 list


SExp make_number(const char* str);

void format(SExp ostrm, const char* fmt, va_list* pap, ...);

SExp array2s(SExp* tbl, int n);		//< array to list

unsigned int strhash(const char* str);

#ifdef __cplusplus
} // extern "C"
#endif

#endif
